#include <stdio.h>

void func(const int *a) //从外面传过来的值不能改，只能用，保证数据安全
{
    printf("%d\n", *a);
}

int main()
{
    /*常量关键字：当初对它的定义是：不可修改的变量（但其实是矛盾的，既然是变量，那么就有内存，有内存就可以通过指针修改）
        开发期 -> 编译 -> 运行
        常量：运行期开始时绝对不能修改的量才称为常量，那么就要在编译期定下来，于是想到宏定义（#define Max 100），它在编译的预处理阶段就被替换掉了，Max都被替换成100，后面就不能改了
        伪常量：由于const是变量，那么可以在运行期申请空间，空间申请完通过指针就可以改，所以const不能称为真正的常量，称为伪常量
        综上所述，define是一个真正的常量，const不是
        问：define和const的区别？
        答：define是宏定义，它在编译的预处理阶段就生效，进行文本替换，而const是常量关键字，它所修饰的变量在运行期进行申请，通过变量名没有办法修改，但是因为它有内存，所以可以通过指针去修改，所以define定义的常量在运行期不可以再修改，而const可以修改*/
#if 0
    const int a = 3;    
    //a++;    //不允许修改（表达式必须是可修改的左值）
    
    int *p = &a;
    *p = 4;
    printf("%d\n", a);
#endif

#if 0
    int a = 10;
    int b = 20;

    //const修饰的是指针（*p）：指针指向的内存值不能改:
    const int *p = &a;  //常量指针：指针指向的是一个常量，通过该指针没有办法修改指向的内存的值
    //*p = 20;      //不能改值（表达式必须是可修改的左值）
    //p = &b;       //可以改朝向

    //const修饰的是变量（p）：变量不能改，就意味着它里面存的地址不能改，就说明它不能指向别的变量
    int* const p2 = &a;  //指针常量：指针本身是一个常量，不能修改指针的朝向，
    //p2 = &b;      //不能改朝向
    //*p2 = 20;     //可以改值
#endif

#if 1
    int a = 10;
    func(&a);  
#endif

    return 0;
}